#ifndef GENERADORHASHINGPERFECTO_H_
#define GENERADORHASHINGPERFECTO_H_
#define NUMERO_DE_FUNCIONES 2
#define CTE_ARISTAS  1.4

//#include "../Extras/Configuracion.h"
#include "GeneradorNumeroRandom.h"
#include "Grafo.h"

#include <algorithm>
#include <string.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>


class GeneradorHashingPerfecto {
private:
	GeneradorNumeroRandom *generadorRandom;
	std::vector <unsigned> *funcionUno;
	std::vector <unsigned> *funcionDos;
	std::vector <std::string*> palabras;
	std::string indice;

	unsigned sizeFuncionesConfigurables;
	unsigned numeroDeAristas;
	unsigned numeroDeVertices;
	Grafo* grafo;

	std::pair <unsigned, unsigned> aplicarFunciones(const std::string& palabra);
	void configurarFunciones();

	//Si el grafo no es ciclico devuelve true
	bool generarGrafo();
	bool verificarGrafo();
	bool hidratarGrafo;


public:
	GeneradorHashingPerfecto(const std::string indice,std::vector <std::string*> & _palabras, unsigned longitudFuncionesConfigurables = 256);
	void inicializar();
	GeneradorHashingPerfecto();
	GeneradorHashingPerfecto(const std::string indice);

	virtual ~GeneradorHashingPerfecto();
	unsigned obtenerIndex(const std::string& palabra);
	void serializar();
	bool hidratar();
	void imprimirTablaHash();
	void imprimirFunciones();
	void imprimirEspacioHasheado();
};
#endif /* GENERADORHASHINGPERFECTO_H_ */
